/*
 * Copyright (c) 2019, Waterbell and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 */

package com.shuiqinling.ww.android;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;

import com.shuiqinling.ww.android.Util.LebianHelper;
import com.shuiqinling.ww.android.Util.PayHelper;
import com.shuiqinling.ww.android.Util.TDGAHelper;
import com.shuiqinling.ww.android.Util.UIHelper;
import com.shuiqinling.ww.android.Util.Utils;
import com.shuiqinling.ww.android.alipay.AliPay;
import com.shuiqinling.ww.android.cn00.wxapi.WXEntryActivity;
import com.shuiqinling.ww.android.cn00.wxapi.WeChat;
import com.shuiqinling.ww.android.qq.QQApi;
import com.tendcloud.tenddata.TalkingDataGA;
import com.unity3d.player.UnityPlayer;

/**
 * 
 * <b>这里是核心类</b>
 * 
 * <pre>
 * AndroidDirectCall.java
 * 1.所有需要暴露给Unity调用的接口都要在这里定义
 * 2.复杂的功能实现可以单独写出一个类，这个类主要负责，参数的传递和转化(比如key value字符串到json)
 * 3.
 * </pre>
 * 
 * @author LSN
 * 
 * @version 1.0
 * 
 */
public class AndroidDirectCall {

	private static Activity unity_activity;
	private static final String TAPTAP_PACKAGE_NAME = "com.taptap";

	/**
	 * 大部分SDK的初始化 都在这里完成 这个方法会被 UnityAcitvity 在OnCreate 的位置调用
	 * 大部分SDK的也一般要求在这个位置初始化
	 * 
	 * @param act
	 */
	public static void Init(Activity act) {
		UIHelper.Init(act);
		unity_activity = act;
		AliPay.init(unity_activity);
		WeChat.init(unity_activity);
		// Talking Data
		TalkingDataGA.init(unity_activity, Constansts.TALKINGDATA_APPID, Constansts.TALKINGDATA_CHANNEL_ID);
		QQApi.getInstance(unity_activity);
	}

	// 对应完整的测试支付流程
	/**
	 * 测试接口已经废弃
	 * 
	 * @param paramStr
	 */
	@Deprecated
	public static void TestPay(String paramStr) {

		if (TextUtils.isEmpty(paramStr)) {
			Log.d("AndroidDirectCall", "PAY FAILED!PARAM IS EMPTY!");
			return;
		}

		int channelID = Utils.getValueFromParamStr(paramStr, "channelId");

		HashMap<String, String> paramMap = Utils.parseParamStr(paramStr);
		PayHelper.pay(unity_activity, channelID, paramMap);
	}

	// 支付
	/**
	 * 国服支付接口
	 * 
	 * @param channelID
	 * @param json
	 */
	public static void DoPay(int channelID, String json) {
		PayHelper.doPay(unity_activity, channelID, json);
	}

	// QQApi
	/**
	 * QQ登录<br>
	 * 
	 * @see QQApi
	 */
	public static void DoQQLogin() {
		QQApi.getInstance(unity_activity).doQQLogin();
	}

	/**
	 * 微信登录 根据服务器要求 appid和appssecret由服务器保存<br>
	 * 微信需要注意的相关点
	 * 1.接入微信登录以及支付功能的SDK 必须保持 包名和md5 和微信开放平台后台填写的一致（不然不会报错也不会有反应）<br>
	 * 2.
	 * @param appid
	 * @param appsecret
	 */
	public static void DoWXLogin(String appid, String appsecret) {
		WXEntryActivity.APP_ID_FOR_LOGIN = appid;
		WXEntryActivity.APP_SECRET_FOR_LOGIN = appsecret;
		WeChat.login();
	}

	/**
	 * ClientChID（即cid）是客户端识别渠道的重要编号 存储在AndroidManifest 中 每个渠道需要更改对应的 cid 相关
	 * CID对应的 渠道 请查阅渠道表
	 * 
	 * 这是一个异步方法(unity 请求cid时 并不会直接得到 而是在unity收到的java消息中拿到)
	 * 
	 * 日本DMM 韩国EFUn
	 */
	public static void GetClientChId() {
		ApplicationInfo appInfo;
		try {
			appInfo = unity_activity.getPackageManager().getApplicationInfo(unity_activity.getPackageName(), PackageManager.GET_META_DATA);
			HashMap<String, String> paramData = new HashMap<String, String>();
			paramData.put("clientChID", String.valueOf(appInfo.metaData.getInt("ClientChId")));
			SendMessageToUnity("CLIENTCHID", paramData);
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 与上面的GetClientChID方法功能相同 这个方法是同步的 你可以直接拿到cid的值
	 * 
	 * @return
	 */
	public static int GetClientChId2() {
		ApplicationInfo appInfo;
		try {
			appInfo = unity_activity.getPackageManager().getApplicationInfo(unity_activity.getPackageName(), PackageManager.GET_META_DATA);
			return appInfo.metaData.getInt("ClientChId");
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return -1;
	}

	public static final int CLIENT_VERSION_NORMAL = 0;
	public static final int CLIENT_VERSION_YIJIE = 1;
	public static final int CLIENT_VERSION_EFUN = 2;

	/**
	 * 客户端版本（类型） 与Unity客户端协商实现的一个接口<br> 主要帮助Unity 客户端辅助判断 登录逻辑类型以及客户端UI展示类型<br>
	 * （不同渠道的类型可能一样也可能不一样，所以如果只有渠道号区分可能会不明确，所以单独加了一个ClientVersion）<br>
	 * 
	 * @return
	 */
	public static int GetClientVersion() {
		return CLIENT_VERSION_NORMAL;
	}

	/**
	 * 易接是一个第三方整合框架(使得接入第三方渠道SDK更快速)<br>
	 * 总体来说的功能就是 我们模拟接入 易接SDK提供的抽象 渠道SDK接口 （登录登出退出 等等）<br>
	 * 
	 * 详见：http://www.1sdk.cn/omsdk-newguide.html<br>
	 * 
	 * 这个方法主要用来判断是否使用易接（通过AndroidManifest.xml中一个 metadata 实现）
	 * @return
	 */
	public static boolean HasYijie() {
		ApplicationInfo appInfo;
		try {
			appInfo = unity_activity.getPackageManager().getApplicationInfo(unity_activity.getPackageName(), PackageManager.GET_META_DATA);
			return appInfo.metaData.getBoolean("USE_YIJIE");
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return false;
	}

	// Talking Data
	/**
	 * talking data SDK 是一个 游戏数据打点分析工具<br>
	 * 目前国服更倾向于使用 同类产品的adjust <br>
	 * TDGA被逐渐弃用<br>
	 * 详见：https://www.talkingdata.com/<br>
	 * @param eventType
	 * @param paramStr
	 */
	public static void TDGA_Event(int eventType, String paramStr) {
		if (TextUtils.isEmpty(paramStr)) {
			Log.d("AndroidDirectCall", "TDGA_Event FAILED!PARAM IS EMPTY!");
			return;
		}
		HashMap<String, String> paramMap = Utils.parseParamStr(paramStr);
		TDGAHelper.processEvent(eventType, paramMap);
	}

	/**
	 * 手动强制乐变更新<br>
	 * 乐变SDK是一套 app更新解决方案<br>
	 * 可以实现app的整包更新<br>
	 * 乐变SDK的机制是每次启动APP会自动检查app是否有更新<br>
	 * 但是有的时候会失效,所以这个接口会每次在适当的时机由Unity调用一次<br>
	 */
	public static void LebianCheckUpdate() {
		LebianHelper.queryUpdate(unity_activity);
	}

	/**
	 * 我们的游戏 会和taptap平台联动<br>
	 * 这个方法会检查手机是否安装的taptap app<br>
	 * 如果手机安装了taptap app,则我们使用taptap://这样的url 来打开我们游戏的在taptap的页面<br> 
	 * 否则我们使用标准http链接 打开网页<br>
	 * 
	 */
	public static void CheckTapTap() {
		if (Utils.isPackageAvilible(unity_activity, TAPTAP_PACKAGE_NAME)) {
			Utils.goURL(unity_activity, "taptap://taptap.com/app?app_id=12944&source=outer");
		} else {
			Utils.goURL(unity_activity, "http://d.taptap.com/latest?app_id=12944");
		}
	}

	/**
	 * 所有android 回传给unity的数据都要通过这个方法<br>
	 * 这两项不能更改：（除非你知道你在干什么）
	 * GameObject :AndroidReceiver<br>
	 *  方法名:ReceiveMsg<br>
	 *  
	 * @param messageType
	 * @param paramData
	 */
	public static void SendMessageToUnity(String messageType, HashMap<String, String> paramData) {
		try {
			JSONObject message = new JSONObject();
			message.put("type", messageType);

			Iterator<String> i = paramData.keySet().iterator();
			while (i.hasNext()) {
				String key = i.next();
				String value = paramData.get(key);
				message.put(key, value);
			}

			UnityPlayer.UnitySendMessage("AndroidReceiver", "ReceiveMsg", message.toString());
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}

	// sd卡剩余空间大小
	/**
	 * 为游戏热更系统 提供 检查手机剩余存储空间大小的功能<br>
	 * @return
	 */
	public static long GetExternalStorageFreeSpace() {
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
			return unity_activity.getExternalFilesDir("").getFreeSpace();
		} else {
			return unity_activity.getFilesDir().getFreeSpace();
		}
	}

	/**
	 * 指定路径的 剩余存储空间大小 第二种方法
	 * @param path
	 * @return
	 */
	public static long GetPathFreeSpace(String path) {

		try {
			File dir = new File(path);
			if (dir.isDirectory()) {
				return dir.getFreeSpace();
			} else {
				return 0;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}
	}
}